//
//  GCDTool.swift
//  ANOA
//
//  Created by hudan on 2025/6/4.
//  Copyright © 2025 aowang. All rights reserved.
//

import Foundation

/**
    多个并发任务完成后的处理方式:
    一: DispatchGroup
        1.  let group = DispatchGroup()
        2.  group.enter() 与 group.leave() 成对出现
            group.enter()
            DispatchQueue.global().async {
                // 异步任务代码
                group.leave()
            }
        3.  group.notify(queue: .main) {
                // 所有任务完成后执行的代码
            }
 
    二: 信号量
        1.  let semaphore = DispatchSemaphore(value: 0)
        2.  semaphore.signal() // 信号量加 1
            DispatchQueue.global().async {
                // 异步执行代码
                semaphore.signal()
            }
        3.  semaphore.wait() // 信号量减 1, 当信号量为 0 时会一直等待(阻塞所在的线程)
            // 设置超时等待时间
            switch semaphore.wait(timeout: .now() + 10) {
                case .success:
                    print("success")
                case .timedOut:
                    print("timeout")
            }
 
    三: 栅栏
        // 栅栏前的多个任务
        DispatchQueue.global().async {
            // 异步任务
        }
        ......
 
        DispatchQueue.global().async(flags: .barrier) {
            
        }
 
        DispatchQueue.global().async {
            // 栅栏执行后才能执行
        }
        ......
 */

struct GCD {
    /// 延迟执行
    static func After(seconds: TimeInterval, execute: @escaping (() -> Void)) {
        DispatchQueue.global().asyncAfter(deadline: .now() + seconds) {
            execute()
        }
    }
    /// 主线程队列
    static func Main() -> DispatchQueue {
        return DispatchQueue.main
    }
    
    /// 全局队列
    static func Global() -> DispatchQueue {
        return DispatchQueue.global()
    }
    
    /// 串行队列
    /// - Parameter label: 名称, 默认 "serial"
    static func Serial(label: String = "serial") -> DispatchQueue {
        return DispatchQueue(label: label, attributes: .init(rawValue: 0))
    }
    
    /// 并行队列
    /// - Parameter label: 名称, 默认 "concurrent"
    static func Concurrent(label: String = "concurrent") -> DispatchQueue {
        return DispatchQueue(label: label, attributes: .concurrent)
    }
}

